#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@NAME          : user_api.py
@TIME          : 2025/03/01 16:30:00
@AUTHOR        : chenlip
@VERSION       : 0.1.0
@DESCRIPTION   : 用户服务相关API，使用flask_restx实现，采用装饰器方式定义模型
'''

from flask import Blueprint, request
from flask_restx import Api, Resource, Namespace
from flask_login import logout_user
from flask_jwt_extended import jwt_required, get_jwt_identity

from app.service.user_service import UserService
from app.blueprints.api import all_models

# 创建命名空间
auth_ns = Namespace('auth', description='用户认证相关操作')

# 注册所有模型并获取模型字典
models = all_models

@auth_ns.route('/v1/login', methods=['POST'], description='用户登录接口, 登录成功返回用户信息和访问令牌,访问方式：/api/auth/v1/login')
class Login(Resource):
    """用户登录接口"""
    
    @auth_ns.expect(models['LoginRequest'])
    @auth_ns.response(200, '登录成功', models['LoginResponse'])
    @auth_ns.response(401, '登录失败', models['BaseResponse'])
    def post(self):
        """
        用户登录
        
        登录成功返回用户信息和访问令牌
        """
        # 从请求中获取登录数据
        login_data = request.json
        
        # 调用登录服务
        result = UserService.login(login_data)
        
        # 根据登录结果返回相应状态码
        if result['success']:
            return result, 200
        else:
            return result, 401

@auth_ns.route('/v1/logout')
class Logout(Resource):
    """用户登出接口"""
    
    @jwt_required()
    @auth_ns.response(200, '登出成功', models['BaseResponse'])
    def post(self):
        """
        用户登出
        
        需要JWT认证
        """
        # 获取当前用户ID
        user_id = get_jwt_identity()
        
        # 调用登出服务
        result = UserService.logout(user_id)
        
        return result, 200

@auth_ns.route('/v1/refresh')
class RefreshToken(Resource):
    """刷新访问令牌接口"""
    
    @jwt_required(refresh=True)
    @auth_ns.response(200, '刷新成功', models['TokenResponse'])
    @auth_ns.response(401, '刷新失败', models['BaseResponse'])
    def post(self):
        """
        刷新访问令牌
        
        需要刷新令牌认证
        """
        # 获取当前用户ID
        user_id = get_jwt_identity()
        
        # 刷新令牌
        result = UserService.refresh_token(user_id)
        
        if result['success']:
            return result, 200
        else:
            return result, 401

@auth_ns.route('/v1/profile')
class UserProfile(Resource):
    """用户资料接口"""
    
    @jwt_required()
    @auth_ns.response(200, '获取成功', models['ProfileResponse'])
    @auth_ns.response(401, '获取失败', models['BaseResponse'])
    def get(self):
        """
        获取用户资料
        
        需要JWT认证
        """
        # 获取当前用户ID
        user_id = get_jwt_identity()
        
        # 获取用户资料
        result = UserService.get_user_profile(user_id)
        
        if result['success']:
            return result, 200
        else:
            return result, 401